﻿if exists (select name from sysobjects where name ='spu_capnhatdatmuasanpham')
	drop proc spu_capnhatdatmuasanpham
go

create proc spu_capnhatdatmuasanpham(@IDNguoiDungSanPham int, @IDSanPham int, @SoLuong int, @IDDaiLy int)
as
	begin tran
	set tran isolation level SERIALIZABLE;
	declare @SoLuongSanPham int, @SoLuongSanPhamDaDat int,@ID int
	select @SoLuongSanPham=SoLuong from SanPham with (UPDLOCK) where ID=@IDSanPham and ThoiGianBatDauBan<=GETDATE() and ThoiGianKetThucBan>=GETDATE()
	select @SoLuongSanPhamDaDat=SoLuong from NguoiDung_SanPham with (UPDLOCK) where ID=@IDNguoiDungSanPham
	select @ID=ID from NguoiDung_SanPham with (UPDLOCK) where ID=@IDNguoiDungSanPham and IDTrangThaiSanPham=1
	if(@SoLuongSanPham is null)
	begin
		raiserror(N'Không thể cập nhật vì sản phẩm đã hết thời hạn bán',16,1)
		rollback tran
		return
	end
	if(@ID is null)
	begin
		raiserror(N'Không thể cập nhật vì sản phẩm đã được thanh toán',16,1)
		rollback tran
		return
	end
	if(@SoLuongSanPham+@SoLuongSanPhamDaDat-@SoLuong<0)
	begin
		raiserror(N'Không thể cập nhật số lượng vượt quá số lượng còn lại của sản phẩm',16,1)
		rollback tran
		return
	end
	update SanPham set SoLuong=SoLuong+@SoLuongSanPhamDaDat-@SoLuong where ID=@IDSanPham
	update NguoiDung_SanPham set SoLuong=@SoLuong,IDDaiLyNhanSanPham=@IDDaiLy where ID=@IDNguoiDungSanPham
	if(@@ERROR<>0)
	begin
		raiserror(N'Đã có lỗi trong quá trình cập nhật sản phẩm',16,1)
		rollback tran
		return
	end
	commit tran
go